﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;
using Lincolnwood.Foundation.SermonLibrary.Data;
using Lincolnwood.Foundation.Common.Data;

namespace Lincolnwood.Foundation.SermonLibrary.Tests
{
    /// <summary>
    /// Summary description for SermonLibraryServiceTest
    /// </summary>
    [TestClass]
    public class SermonLibraryServiceTest
    {
        ISermonRepository mockSermonRepository;
        ISermonSeriesRepository mockSermonSeriesRepository;
        IUnitOfWork mockUnitOfWork;
        SermonLibraryService testService;

        public SermonLibraryServiceTest()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestInitialize]
        public void Initialize()
        {
            mockSermonRepository = MockRepository.GenerateMock<ISermonRepository>();
            mockSermonSeriesRepository = MockRepository.GenerateMock<ISermonSeriesRepository>();
            mockUnitOfWork = MockRepository.GenerateMock<IUnitOfWork>();
            testService = new SermonLibraryService(mockUnitOfWork, mockSermonRepository, mockSermonSeriesRepository);
        }

        [TestMethod]
        public void CreateSermonLibraryService_UsingInjectedRepository_Succeeds()
        {
            // Initialize should have taken care of instantiation
            Assert.IsNotNull(testService);
        }

        [TestMethod]
        public void GetSermonById_FindsExpectedSermon()
        {
            Guid testId = Guid.NewGuid();
            Sermon expectedSermon = new Sermon("Test Sermon Title", 
                "Test sermon description.", 
                "TestFirst", 
                "TestLast", 
                "TestTitle", 
                (DateTime.Parse("12/24/2001")), 
                "TestLocation", 
                new MediaLink("testMediaUri"));

            mockSermonRepository.Expect(rep => rep.FindById(testId)).Return(expectedSermon);

            Sermon actualSermon = testService.GetSermonById(testId);

            Assert.AreEqual(expectedSermon, actualSermon);
        }
    }
}
